<?php
namespace Game\Model;
use Think\Model;
/**
 * du 2025.2.11
 * 游戏用户模型
 * Summary of GameUserModel
 * @author du
 * @package Common\Model
 */

class GameUserModel extends Model{
    /**
     * du 2025.2.10
     * 添加游戏用户
     * Summary of _add_game_user
     * @param mixed $post
     * @return $user_info
     */
    public function _add_game_user($post){
        //校验必填信息
        if(!$post['openid']){
            return [
                'status' => 0,
                'msg' => '用户openid不能为空'
            ];
        }
        // 创建一个默认新用户
        $data = C('DEFAULT_USER_INFO');
        // 如果是微信 则有open_id
        $data['openid'] = $post['openid'] ? $post['openid'] : '';
        $data['client'] = $post['client'] ? $post['client'] : 'default';
        $data['nickname'] = $post['nickname'] ? $post['nickname'] : '';
        $data['avatar_url'] = $post['avatar_url'] ? $post['avatar_url'] : '';
        $data['tel'] = $post['tel'] ? $post['tel'] : '';
        $data['energy_recover_timestamp'] = time();
        $data['create_time'] = time();
        $data['update_time'] = time();
        // 重置每日任务，并校验任务
        $task_list = _get_config_table()->getTbDailyTask()->getDataList();
        // 遍历任务列表
        foreach($task_list as $k => $v){
            // 先重置玩家的每日任务，如果更新时间是今天凌晨之前，则重置任务进度和状态
            // 如果玩家没有这条任务标记，则添加
            $data['task'][$v->id] = [
                'progress' => 0,
                'status' => 0,
                'update_time' => time()
            ];
            $task_match = _check_action_match($v->actionUrl, $v->actionParams, $v->paramsLogic);
            // 如果任务匹配，判断任务是否完成
            if($task_match){
                // 如果任务已经完成，直接跳过
                if($data['task'][$v->id]['status'] > 0){
                    continue;
                }
                else{
                    $data['task'][$v->id]['progress'] ++;
                    // 如果任务进度大于等于任务目标，标记任务完成
                    if($data['task'][$v->id]['progress'] >= $v->totalProgress){
                        $data['task'][$v->id]['status'] = 1;
                    }
                    // 更新任务时间
                    $data['task'][$v->id]['update_time'] = time();
                }
            }
        }
        // 重置每日限制，并记录行为
        $limit_list = _get_config_table()->getTbLimit()->getDataList();
        // 遍历限制列表
        foreach($limit_list as $k => $v){
            // 先重置玩家的每日限制，如果更新时间是今天凌晨之前，则重置限制进度和状态
            // 这里设置下一次过期时间的时候要根据limit的expireTime来设置，day/week/month/year
            $expire_time_map = [
                'day' => strtotime('tomorrow midnight'),
                'week' => strtotime('next monday midnight'),
                'month' => strtotime('first day of next month midnight'),
                'year' => strtotime('first day of next year midnight') 
            ];
            // 如果玩家没有这条限制标记，则添加
            $data['limit'][$v->id] = [
                'count' => 0,
                'expire_time' => $expire_time_map[$v->expireTime]
            ]; 
            // 进行任务匹配
            $limit_match = _check_action_match($v->actionUrl, $v->actionParams, $v->paramsLogic);
            // 判断请求的URL是否匹配
            if($limit_match){
                // 理论上此处应该是满足限制条件的，就不做多次判断了
                $data['limit'][$v->id]['count'] ++;
            }
        }
        // 初始化活动列表
        // $data['activity'] = _init_user_activity();
        $data = _format_user_info($data, 'json');
        $res = $this->add($data);
        return $res;
    }

    /**
     * du 2025.2.10
     * 编辑玩家信息
     * 需要把对象转成json格式
     * 在这里处理任务完成、每日限制等信息，以后还要加上生涯成就等信息
     * Summary of _edit_game_user_info
     * @param mixed $uid
     * @param mixed $post
     * @return bool res
     */
    public function _edit_game_user_info($post){
        // 校验必填信息
        if(!$post['id']){   
            return false;
        }
        // 重置每日任务，并校验任务
        $task_list = _get_config_table()->getTbDailyTask()->getDataList();
        // 遍历任务列表
        foreach($task_list as $k => $v){
            // 先重置玩家的每日任务，如果更新时间是今天凌晨之前，则重置任务进度和状态
            // 如果玩家没有这条任务标记，则添加
            if(!$post['task'][$v->id]){
                $post['task'][$v->id] = [
                    'progress' => 0,
                    'status' => 0,
                    'update_time' => time()
                ];
            }
            else if($post['task'][$v->id]['update_time'] < strtotime('today midnight') ){
                $post['task'][$v->id] = [
                    'progress' => 0,
                    'status' => 0,
                    'update_time' => time()
                ];
            }
            $task_match = _check_action_match($v->actionUrl, $v->actionParams, $v->paramsLogic);
            // 如果任务匹配，判断任务是否完成
            if($task_match){
                // 如果任务已经完成，直接跳过
                if($post['task'][$v->id]['status'] > 0){
                    continue;
                }
                else{
                    $post['task'][$v->id]['progress'] ++;
                    // 如果任务进度大于等于任务目标，标记任务完成
                    if($post['task'][$v->id]['progress'] >= $v->totalProgress){
                        $post['task'][$v->id]['status'] = 1;
                    }
                    // 更新任务时间
                    $post['task'][$v->id]['update_time'] = time();
                }
            }
        }
        // 重置每日限制，并记录行为
        $limit_list = _get_config_table()->getTbLimit()->getDataList();
        // 遍历限制列表
        foreach($limit_list as $k => $v){
            // 先重置玩家的每日限制，如果更新时间是今天凌晨之前，则重置限制进度和状态
            // 这里设置下一次过期时间的时候要根据limit的expireTime来设置，day/week/month/year
            $expire_time_map = [
                'day' => strtotime('tomorrow midnight'),
                'week' => strtotime('next monday midnight'),
                'month' => strtotime('first day of next month midnight'),
                'year' => strtotime('first day of next year midnight') 
            ];
            // 如果玩家没有这条限制标记，则添加
            if(!$post['limit'][$v->id]){
                $post['limit'][$v->id] = [
                    'count' => 0,
                    'expire_time' => $expire_time_map[$v->expireTime]
                ]; 
            }
            else if($post['limit'][$v->id]['expire_time'] < time() ){
                $post['limit'][$v->id] = [
                    'count' => 0,
                    'expire_time' => $expire_time_map[$v->expireTime]
                ];
            }
            // 进行任务匹配
            $limit_match = _check_action_match($v->actionUrl, $v->actionParams, $v->paramsLogic);
            if($limit_match){
                // 理论上此处应该是满足限制条件的，就步做多次判断了
                $post['limit'][$v->id]['count'] ++;
            }
        }
        // 检查本次请求是否完成某个引导
        // 只检查带有actionUrl的引导
        $guide_list = _get_config_table()->getTbGameGuideGroup()->getDataList();
        foreach($guide_list as $k => $v){
            if(!$v->actionUrl){
                continue;
            }
            $guide_match = _check_action_match($v->actionUrl, $v->actionParams, $v->paramsLogic);
            if($guide_match){
                $post['guide'][$v->id] = 1;
            }
        }
        $where['id'] = $post['id'];
        // $where['status'] = 1;
        $where['is_del'] = 0;
        // 把对象转成json格式
        // 判断要排序的项目
        $keys = ['stage', 'idol', 'task', 'activity', 'limit', 'career', 'backpack', 'achievement'];
        foreach($keys as $k){
            if($post[$k]){
                ksort($post[$k]);
            }
        }
        $post = _format_user_info($post, 'json');
        $post['update_time'] = time();
        $res = $this->where($where)->save($post);
        return $res;
    }

    /**
     * du 2025.2.10
     * 获取玩家信息
     * 需要把json格式转成对象
     * 在这里处理第一次每日限制的判断，如果超出限制直接返回失败
     * Summary of _get_game_user_info
     * @param mixed $uid
     * 此处获取的是原始数据 不转译
     * 获取数据的时候带上每日限制检查，任务检查，引导检查
     */
    public function _get_game_user_info($uid, $field = '*'){
        if($field != '*'){
            $field .= ',guide,limit,task,id,status,is_del';
        }
        $res = $this->field($field)->find($uid);
        if(!$res){
            return false;
        }
        $res = _format_user_info($res, 'array');
        return $res;
    }

    /**
     * du 2025.2.10
     * 根据openid获取玩家
     * Summary of _get_game_user_info_by_openid
     * @param mixed $openid 
     */
    public function _get_game_user_by_openid($openid, $field = '*'){
        $res = $this->where(['openid' => $openid])->field($field)->find();
        if(!$res){
            return false; 
        }
        $res = _format_user_info($res, 'array');
        return $res;
    }


}